const Koa = require('koa');
const router = require('koa-router')();
const KoaSSEStream = require('koa-sse-stream'); // 封装好的 SSE 中间件
const bodyParser = require('koa-bodyparser');
const cors = require('@koa/cors');
const app = new Koa();

const { getNewDate } = require('./utils')

app.use(cors());
app.use(bodyParser());

// 连接池
let clientList = [];
let timer = null
// koa-sse-stream 配置
const SSE_CONF = {
	maxClients: 2, // 最大连接数
	pingInterval: 40000 // 重连时间
}
router.get('/api/push', KoaSSEStream(SSE_CONF), ctx => {
	// 每次连接会进行一个 push
	clientList.push(ctx.sse);
})
router.post('/api/connect', ctx => {
	// 接收项目绝对路径
	// console.log(ctx.request.body)
	try {
		// 先响应
		ctx.body = {
			msg: '服务端开始推送，请留意下方的推送信息。'
		}
		// 再推送信息
		buildProject()
	} catch (error) {
		ctx.body = {
			msg: error
		}
	}
})
router.post('/api/close', ctx => {
	clientList = []
	timer && clearTimeout(timer)
	ctx.body = {
		msg: '关闭连接'
	}
})

const buildProject = async projectPath => {
	messagePush('推送信息🌲！！！')
	timer = setTimeout(() => {
		buildProject()
	}, 1000 * 5)
}

/**
 * 消息推送
 * @param {String} content 需要推送的内容
 */
const messagePush = content => {
	console.log(clientList.length)
	clientList.forEach(sse => sse.send(`【${getNewDate()}】 ${content}`))
}

app.use(router.routes())
app.listen(3000, () => {
	console.log('正在监听端口3000...')
});